package com.psdi.element;

/**
 * Vector2D 类表示二维向量，通常用于表示位置、速度等。
 * 该类可以包含向量的 x 和 y 分量，并提供一些基本的向量操作方法。
 */
public class Vector2D {
    public static final Vector2D UP = new Vector2D(0, -1);
    public static final Vector2D DOWN = new Vector2D(0, 1);
    public static final Vector2D LEFT = new Vector2D(-1, 0);
    public static final Vector2D RIGHT = new Vector2D(1, 0);
    public static final Vector2D ZERO = new Vector2D(0, 0);
    public static final Vector2D X_AXIS = new Vector2D(1, 0);
    public static final Vector2D Y_AXIS = new Vector2D(0, 1);
    public float x;
    public float y;

    public Vector2D(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public static Vector2D parseVector2D(String string) {
        String[] parts = string.split(",");
        return new Vector2D(Float.parseFloat(parts[0]), Float.parseFloat(parts[1]));
    }

    public static Vector2D add(Vector2D v1, Vector2D v2) {
        return new Vector2D(v1.x + v2.x, v1.y + v2.y);
    }

    @Override
    public String toString() {
        return x + "," + y;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Vector2D vector2D = (Vector2D) obj;
        return x == vector2D.x && y == vector2D.y;
    }

    @Override
    public int hashCode() {
        int result = Double.hashCode(x);
        result = 31 * result + Double.hashCode(y);
        return result;
    }

    /**
     * 向量的加法
     *
     * @param other 另一个 Vector2D 对象
     * 本方法将当前向量与另一个向量相加，并更新当前向量的 x 和 y 分量。无返回值。
     */
    public void add(Vector2D other) {
        this.x += other.x;
        this.y += other.y;
    }

    /**
     * 向量的hadamard积（Hadamard product）
     *
     * @param other 另一个 Vector2D 对象
     * @return 返回一个新的 Vector2D 对象，表示当前向量与另一个向量的Hadamard积
     */
    public Vector2D hadamard(Vector2D other) {
        return new Vector2D(this.x * other.x, this.y * other.y);
    }

    /**
     * 向量的标量乘法
     *
     * @param scalar 标量值
     * @return 返回一个新的 Vector2D 对象，表示当前向量与标量的乘积
     */
    public Vector2D scalarMultiply(float scalar) {
        return new Vector2D(this.x * scalar, this.y * scalar);
    }

    /**
     * 计算两个点之间的位移向量。
     * 该方法通过计算目标点与起始点的 x 和 y 坐标差值来生成一个新的 Vector2D 对象。
     *
     * @param from 起始点，表示位移的起点。
     * @param to 目标点，表示位移的终点。
     * @return 一个新的 Vector2D 对象，表示从起始点到目标点的位移。
     */
    public static Vector2D displacement(Position from, Position to) {
        return new Vector2D(to.x - from.x, to.y - from.y);
    }
    public Vector2D normalize() {
        float length = module();
        if (length != 0) {
            x /= length;
            y /= length;
        }
        return this;
    }
    public float module() {
        return (float) Math.sqrt(x * x + y * y);
    }

}
